home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Resources / Online / Term / Extras / Source / gtlayout-source.lha / LT_DeleteHandle.c < prev    next >
C/C++ Source or Header  |  1996-08-22  |  4KB  |  225 lines

  1. /*
  2. **    GadTools layout toolkit
  3. **
  4. **    Copyright © 1993-1996 by Olaf `Olsen' Barthel
  5. **        Freely distributable.
  6. **
  7. **    :ts=4
  8. */
  9.  
  10. #ifndef _GTLAYOUT_GLOBAL_H
  11. #include "gtlayout_global.h"
  12. #endif
  13.  
  14. #ifdef DO_BOOPSI_KIND
  15. STATIC VOID
  16. LTP_BOOPSI_Cleanup(ObjectNode *group)
  17. {
  18.     ObjectNode *node;
  19.  
  20.     SCANGROUP(group,node)
  21.     {
  22.         switch(node->Type)
  23.         {
  24.             case BOOPSI_KIND:
  25.  
  26.                 DB(kprintf("2) disposing boopsi object\n"));
  27.  
  28.                 CloseLibrary(node->Special.BOOPSI.ClassBase);
  29.                 node->Special.BOOPSI.ClassBase = NULL;
  30.  
  31.                 FreeTagItems(node->Special.BOOPSI.ClassTags);
  32.                 node->Special.BOOPSI.ClassTags = NULL;
  33.  
  34.                 break;
  35.  
  36.             case GROUP_KIND:
  37.  
  38.                 LTP_BOOPSI_Cleanup(node);
  39.                 break;
  40.         }
  41.     }
  42. }
  43. #endif
  44.  
  45. VOID
  46. LTP_DisposeGadgets(struct LayoutHandle *Handle)
  47. {
  48.     if(Handle->List)
  49.     {
  50.         struct Gadget    *Gadget;
  51.         ObjectNode        *Node;
  52.  
  53.         LTP_StripGadgets(Handle,Handle->List);
  54.  
  55.         Gadget = Handle->List;
  56.  
  57.         if(Handle->ExitFlush)
  58.         {
  59.             while(Gadget)
  60.             {
  61.                 if(GETOBJECT(Gadget,Node))
  62.                 {
  63.                     LTP_PutStorage(Node);
  64.  
  65.                     LTP_DeleteObjectNode(Handle,Node);
  66.                 }
  67.  
  68.                 Gadget = Gadget->NextGadget;
  69.             }
  70.         }
  71.         else
  72.         {
  73.             while(Gadget)
  74.             {
  75.                 if(GETOBJECT(Gadget,Node))
  76.                     LTP_DeleteObjectNode(Handle,Node);
  77.  
  78.                 Gadget = Gadget->NextGadget;
  79.             }
  80.         }
  81.  
  82.         FreeGadgets(Handle->List);
  83.  
  84.         Handle->List = NULL;
  85.     }
  86.  
  87. #ifdef DO_BOOPSI_KIND
  88.     if(Handle->BOOPSIList)
  89.     {
  90.         struct Gadget *gadget = (struct Gadget *)Handle->BOOPSIList,*next;
  91.         ObjectNode *Node;
  92.  
  93.         LTP_StripGadgets(Handle,(struct Gadget *)Handle->BOOPSIList);
  94.  
  95.         while(gadget)
  96.         {
  97.             next = gadget->NextGadget;
  98.  
  99.             if(GETOBJECT(gadget,Node))
  100.             {
  101.                 DB(kprintf("1) disposing boopsi object\n"));
  102.  
  103.                 DisposeObject(gadget);
  104.                 Node->Host = NULL;
  105.             }
  106.  
  107.             gadget = next;
  108.         }
  109.  
  110.         Handle->BOOPSIList = NULL;
  111.         Handle->BOOPSIPrevious = NULL;
  112.     }
  113.  
  114.         // Clean up all BOOPSI objects. This includes even those
  115.         // which have never been displayed.
  116.  
  117.     LTP_BOOPSI_Cleanup(Handle->TopGroup);
  118. #endif    /* DO_BOOPSI_KIND */
  119. }
  120.  
  121.  
  122. /*****************************************************************************/
  123.  
  124.  
  125. /****** gtlayout.library/LT_DeleteHandle ******************************************
  126. *
  127. *   NAME
  128. *    LT_DeleteHandle -- Release storage space allocated by
  129. *                       LT_CreateHandleTagList, closing windows,
  130. *                       removing gadgets, etc.
  131. *
  132. *   SYNOPSIS
  133. *    LT_DeleteHandle(Handle);
  134. *                      A0
  135. *
  136. *    VOID LT_DeleteHandle(LayoutHandle *);
  137. *
  138. *   FUNCTION
  139. *    Windows and gadgets created by LT_CreateHandleTagList()
  140. *    are removed, any associated memory is deallocated.
  141. *
  142. *   INPUTS
  143. *    Handle - Pointer to a LayoutHandle structure created
  144. *        by LT_CreateHandleTaglist(). Passing NULL is
  145. *        harmless.
  146. *
  147. *   RESULT
  148. *    none
  149. *
  150. *   SEE ALSO
  151. *    gtlayout.library/CreateHandleTagList
  152. *
  153. ******************************************************************************
  154. *
  155. */
  156.  
  157. VOID LIBENT
  158. LT_DeleteHandle(REG(a0) LayoutHandle *Handle)
  159. {
  160.     if(Handle)
  161.     {
  162.         if(Handle->UnlockPubScreen)
  163.             UnlockPubScreen(NULL,Handle->PubScreen);
  164. #ifdef DO_CLONING
  165.         if(Handle->CloneExtra && Handle->CloneExtra->Screen)
  166.             ScreenToBack(Handle->CloneExtra->Screen);
  167. #endif
  168.         LTP_DisposeGadgets(Handle);
  169.  
  170.         LT_UnlockWindow(Handle->Parent);
  171.  
  172.         if(Handle->Window)
  173.         {
  174.             LT_DeleteWindowLock(Handle->Window);
  175.  
  176.             if(Handle->MsgPort && Handle->Window->UserPort)
  177.             {
  178.                 struct IntuiMessage    *intuiMsg;
  179.                 struct Node            *next;
  180.  
  181.                 Forbid();
  182.  
  183.                 for(intuiMsg = (struct IntuiMessage *)Handle->Window->UserPort->mp_MsgList.lh_Head ; next = intuiMsg->ExecMessage.mn_Node.ln_Succ ; intuiMsg = (struct IntuiMessage *)next)
  184.                 {
  185.                     if(intuiMsg->IDCMPWindow == Handle->Window)
  186.                     {
  187.                         Remove(intuiMsg);
  188.  
  189.                         ReplyMsg(intuiMsg);
  190.                     }
  191.                 }
  192.  
  193.                 Handle->Window->UserPort = NULL;
  194.  
  195.                 ModifyIDCMP(Handle->Window,NULL);
  196.  
  197.                 Permit();
  198.             }
  199.  
  200.             ClearMenuStrip(Handle->Window);
  201.             CloseWindow(Handle->Window);
  202.         }
  203.  
  204. #ifdef DO_MENUS
  205.         LT_DisposeMenu(Handle->Menu);
  206. #endif    // DO_MENUS
  207.  
  208.         DisposeObject(Handle->AmigaGlyph);
  209.         DisposeObject(Handle->CheckGlyph);
  210.  
  211.         FreeScreenDrawInfo(Handle->Screen,Handle->DrawInfo);
  212.  
  213.         FreeVisualInfo(Handle->VisualInfo);
  214.  
  215.         if(Handle->RPort.Font && Handle->CloseFont)
  216.             CloseFont(Handle->RPort.Font);
  217. #ifdef DO_CLONING
  218.         if(Handle->CloneExtra && Handle->CloneExtra->Screen)
  219.             CloseScreen(Handle->CloneExtra->Screen);
  220. #endif
  221.  
  222.         AsmDeletePool(Handle->Pool,SysBase);
  223.     }
  224. }
  225.